/**
 * 数字枚举，字符串枚举,不建议使用异构枚举【既有字符串又有数字】
 */
enum Status {
    Continue, // 默认0开始
    Success = 2, // 指定值
    Redirect = 1,
    Test, // 上一个值+1， 如与以前的值冲突则覆盖以前的值
    NotFound = 404,
    Error = "4", // 如果上一个值是字符串或函数指定值，则后一个值不能使用自增值 ,且不允许再使用函数计算枚举
    Error2 = 5,
    Error3
}
console.log("Continue", Status.Continue); // 0
console.log("Success", Status.Success); // 0
console.log("Redirect", Status.Redirect); // 1
console.log("Test", Status.Test); // 2
console.log("NotFound", Status.NotFound); // 404
console.log("Error", Status.Error); // "4"
console.log("Error2", Status.Error2); // 5
console.log("Error3", Status.Error3); // 6

/**
 * 函数枚举
 */
const func2 = () => 2
enum Status2 {
    a = func2()
}
console.log(Status2.a); // 2

/**
 * 枚举值可以作为类型使用的情况
 */
enum E1 { A } // 未定义值的情况
enum E2 { A = "A" } // 为字符串的时候
enum E3 { A = 4324.432 } // 包含number，以及负数

enum Animals {
    Dog = 1,
    Cat = "A"
}
interface Dog {
    type: Animals.Dog // 通过接口限制只能为Dog
}
const dog: Dog = {
    type: Animals.Dog
}
interface Cat {
    type: Animals.Cat // 通过接口限制只能为Cat
}
const cat: Cat = {
    type: Animals.Cat
}


enum Car {
    BMW,
    Benz
}
interface Taxi {
    name: Car // 通过接口限制只能为枚举值
}
const taxi1: Taxi = {
    name: Car.BMW
}
const taxi2: Taxi = {
    name: Car.Benz
}
const taxi3: Taxi = { // 可直接写值
    name: 1
}
console.log(taxi3);

/**
 * 添加const 关键字时，编译时直接使用枚举值替换原值不产生类型对象,仅用于提高代码可读性，可提高运行效率
 */
const enum Fruit {
    Apple = 1,
    Banana = 2
}
interface F {
    name: Fruit // 通过接口限制只能为枚举值
}
const fruit: F = { // 可直接写值
    name: Fruit.Apple
}